/**
 * 提供简单MVC设计
 */
jQuery(function($) {
	_.templateSettings = {
	    evaluate    : /\{\{([\s\S]+?)\}\}/g,
	    interpolate : /\{\{=([\s\S]+?)\}\}/g,
	    escape      : /\{\{-([\s\S]+?)\}\}/g
	  };
	mvc.complie = _.memoize(
		function(key){
			var source = $('#'+key).html();
			var render = _.template(source);
			var pDom = $('#'+key).parent();
			
			return function(data){
				var html = render(data);
				pDom.html(html);
			}
		}
	);
	
	CacheMg={
		cc: [],
		put: function(key,value){
			if( !_.isEmpty(key) && !_.isEmpty(value) ){
				var m = this.getObject(key);
				if(_.isObject(m)){
					if(_.isEmpty(m.data)){
						m.data=value;
					} else if(_.isArray(m.data)){
						m.data.push(value);
					} else{
						var tmp = m.data;
						m.data=[];
						m.data.push(tmp);
						m.data.push(value);
					}
				} else{
					var co={id:key, data:value};
					this.cc.push(co);
				}
			}
		},
		getObject: function(key){
			for(var i=0; i < this.cc.length; ++i){
				if(this.cc[i].id === key){
					return this.cc[i];
				}
			}
			return null;
		},
		get: function(key){
			for(var i=0; i < this.cc.length; ++i){
				if(this.cc[i].id === key){
					return this.cc[i].data;
				}
			}
			return null;
		},
		remove: function(key){
			var m = this.getObject(key);
			if(_.isObject(m)){
				m.data=null;
			}
		},
		removeAllByKeyHead: function(keyhead){
			for(var i=0; i < this.cc.length; ++i){
				if(this.cc[i].id.indexOf(keyhead) === 0){
					this.cc[i].data=null;
				}
			}
		}
	};
	
	//自动载入下拉列表的值
	$('[mvc_combox]').each(function(){
		var dictUrl = $(this).attr('mvc_combox');
		var onselect = $(this).attr('onselect');
		var _me = $(this);
		var _d = mvc.ct.dict;
		mvc.lock++;
		$.getJSON(dictUrl,
			function(data,status){
				if(status=='error'){
					alert('载入失败：'+dictUrl)
				} else{
					$.each(data[_d.root], function(i,val){
						if(_me.is('select')){
							_me.append('<option value="'+val[_d.value]+'">'+val[_d.name]+'</option>')
						} else if(_me.is('ul')){
							_me.append('<li value="'+val[_d.value]+'">'+val[_d.name]+'</li>')
						}
					})
					if(_me.is('ul')){
						_me.children('li').click(function(){
							var inputObj = $(this).parents('li').find('span:eq(0)').find(':text:eq(0)');
							inputObj.val($(this).html());
							inputObj.focus();
							$(this).parents('li').find('ul').slideUp('fast');
							if(onselect){
								var val = $(this).attr('value');
								var text = $(this).html();
								var fn = onselect+"(this,'"+val+"','"+text+"')";
								eval(fn);
							}
						})
					}
				}
				mvc.lock--;
			}
		)
		
	})
	//搜索下拉框
	$('[search_combox]').each(function(){
		var searchUrl = $(this).attr('search_combox');
		var onselect = $(this).attr('onselect');
		var inid = $(this).attr('inputid');
		var _c = $(this).attr('codeName');
		var _t = $(this).attr('textName');
		var _me = $(this);
		var loading = false;
		var c='';
		if(searchUrl.indexOf('?') > 0){
			c = "&search="
		} else{
			c = '?search=';
		}
		
		$('#'+inid).on("input",function(){
			var s = $(this).val();
			if(s.length > 1 && !loading){
				loading = true;
				var url = searchUrl + c + s;
				$.getJSON(url,
					function(data,status){
						if(status=='error'){
							alert('载入失败：'+url)
						} else{
							_me.find('li').remove();
							$.each(data['content'], function(i,val){
								if(_me.is('ul')){
									_me.append('<li value="'+val[_c]+'">'+val[_t]+'</li>')
								}
							})
							if(_me.is('ul')){
								_me.find('li').hover(function() {
									$(this).addClass('select_hover')
								}, function() {
									$(this).removeClass('select_hover')
								});
								_me.slideDown('fast');
								_me.children('li').click(function(){
									var inputObj = $(this).parents('li').find('span:eq(0)').find(':text:eq(0)');
									inputObj.val($(this).html());
									inputObj.focus();
									$(this).parents('li').find('ul').slideUp('fast');
									if(onselect){
										var val = $(this).attr('value');
										var text = $(this).html();
										var fn = onselect+"(this,'"+val+"','"+text+"')";
										eval(fn);
									}
								})
							}
						}
						loading = false;
					}
				)
			}
		})
	})
})
mvc = {
	lock: 0,
	
	//静态配置
	ct: {
		//静态数据字典字段配置
		dict: {
			root: 'root',//根路径
			name: 'dictName',//名称属性字段名
			value: 'dictValue'//值属性字段名
		}
	},
	
	/**
	 * 等动态控件数据载入完成后执行。
	 * 1、等待动态下拉列表中的数据载入
	 */
	ready: function(fn){
		if(mvc.lock > 0){
			setTimeout(function(){
				mvc.ready(fn);
			}, 10);
		} else{
			fn.apply(this, arguments);
		}
	},
	
	/**
	 * 编译指定元素下的模板，返回一个经过封装后的渲染器，可以调用渲染器的render把数据更新至页面。
	 * 
	 * 注意：模板必需放到一个空的DOM元素下，例如：
	 * <div> --这儿必需，可以是任意html元素
	 * <script id="template" type="underscore/table">
	 *   这儿写你的模板代码
	 * </script>
	 * <div>
	 */
	complie: null,
	
	/**
	 * 表格分页查询，需要如下参数
	 * form: 查询条件区域的form的ID
	 * url: 提交的服务器地址
	 * templates: 模板语言区域列表,id
	 * data: $.ajax中的data参数
	 * submitSuccess: 查询成功回调函数
	 */
	gridLoad: function(cfg){
		//判断是否在查询中，防止不断点击
		var table=cfg.scope;
		var key = 'QL-';
		if(!_.isEmpty(cfg.form)){
			key += cfg.form;
		} else if(!_.isEmpty(cfg.url)){
			key += cfg.url;
		}
		var lock = CacheMg.get(key);
		
		if(!_.isEmpty(lock) && lock=='QUERYING'){
			return;
		}
		CacheMg.put(key, 'QUERYING');
		
		var submitSuccess = function(data) {
			_.each(cfg.templates, function(k){
				var render = mvc.complie(k);
				render(data);
			});
			
			CacheMg.remove(key);
			table.data = data;
			if(cfg.submitSuccess){
				cfg.submitSuccess(data);
			}
		}
		var submitError = function(resp){
			var rt=resp.responseText;
			if(rt.indexOf('<script') == 0 && rt.indexOf('</script>') > 0){
	    		document.write(rt)
			}else{
				window.showModelessDialog(contextPath+'/page/dialog/dialogWin.html', 
						rt,
	        			"status:false;dialogWidth:800px;dialogHeight:600px");
			}
			CacheMg.remove(key);
			if(cfg.submitError){
				cfg.submitError(resp);
			}
		}
		var options = {
	        //beforeSubmit:  showRequest,  // pre-submit callback
	        success:       submitSuccess,  // post-submit callback
	        error: submitError,
	
	        // other available options:
	        url:       cfg.url,   // override for form's 'action' attribute
	        type:      'get',     // 'get' or 'post', override for form's 'method' attribute
	        dataType:  'json'     // 'xml', 'script', or 'json' (expected server response type)
	        //clearForm: true     // clear all form fields after successful submit
	        //resetForm: true     // reset the form after successful submit
	
	        // $.ajax options can be used here too, for example:
	        //timeout:   3000,
	        ,data: cfg.data
	    };
	    // inside event callbacks 'this' is the DOM element so we first
	    // wrap it in a jQuery object and then invoke ajaxSubmit
	    $('#'+cfg.form).ajaxSubmit(options);
	},
	
	Table: function(args){
		this.form = args.form;
		this.url = args.url;
		this.grid = args.grid;
		this.loadSuccess = args.loadSuccess;
		
		this.headsWidth = [];//表头所有td宽度
		this.ccLeft = 0;//表内容区域的左偏移值
		this.currentPage = 0;
		this.first = true;
		this.last = false;
		this.totalPages=0;
		this.data = null;
		var _me = this;
		
		//初始化分页工具条
		$("#"+this.grid+" [name=firstPage]").click(function(){
			if(_me.currentPage == 0) return;
			_me.load(0);
		});
		$("#"+this.grid+" [name=pageUp]").click(function(){
			if(_me.currentPage == 0) return;
			_me.load(_me.currentPage-1);
		});
		$("#"+this.grid+" [name=pageDown]").click(function(){
			var np=_me.currentPage+1;
			if(np >= (_me.totalPages)){
				return;
			}
			_me.load(np);
		});
		$("#"+this.grid+" [name=lastPage]").click(function(){
			if(_me.currentPage >= (_me.totalPages-1)){
				return;
			}
			_me.lastPage();
		});
		
		$("#"+this.grid+" [name=pageTurn]").click(function(){
			var pn = $("#"+_me.grid+" [name=pageNumber]:input").val();
			//页码从0开始
			_me.load(pn-1);
		});
		
		//为所有模板初始化id，如果没有
		var templates = [];
		$('#'+this.grid+' script').each(function(){
			  if($(this).attr('type')==='underscore/table'){
				  var tid = $(this).attr('id');
				  if(_.isUndefined(tid)){
					  var id = _.uniqueId('jstpl_');
					  $(this).attr('id',id);
					  templates.push(id);
				  } else {
					  templates.push(tid);
				  }
			  }
		  });
		
		//查询方法
		this.load = function(pn){
			if(_.isUndefined(pn)){
				pn = this.currentPage;
			}
			$('#'+_me.grid).mask('正在载入...');
			mvc.gridLoad({
				form: this.form,
				url: this.url,
				templates: templates,
				data: {page: pn},
				scope: this,
				submitSuccess: function(data){
					//自动设置每列宽度
					$.each(_me.headsWidth, function(n,v){
						$('#'+_me.grid+' .x-table-body tr:eq(0)').each(function(){
							$(this).children("td:eq("+n+")").width(v);
						})
					});
					//记录内容显示的初始位置
					var tr0 = $('#'+_me.grid+' .x-grid-content tr:eq(0)');
					if(tr0.position()){
						_me.ccLeft = tr0.position().left;
					}
					
					//记录当前分页信息
					_me.first = data.first;
					_me.last = data.last;
					_me.totalPages=data.totalPages;
					
					$('#'+_me.grid).unmask();
					_me.loadSuccess(data);
				}
			});
			this.currentPage=pn;
		};
		
		this.reload = function(){
			_me.load(_me.currentPage);
		}
		
		/**
		 * 最后一页
		 */
		this.lastPage = function(){
			_me.load(_me.totalPages-1);
		}
		/**
		 * 在查询结果中查找记录，返回匹配的第一条记录
		 * @param name 字段名称
		 * @param value 字段值
		 */
		this.findByName = function(name,value){
			var d = _me.data;
			if(d){
				for(var i=0;i < d.content.length; i++){
					var r = d.content[i];
					if(r[name] == value){
						return r;
					}
				}
			}
			return null;
		}
		
		//横向滚动表头
		$('#'+_me.grid+' .x-grid-content').scroll(function(){
			if(_me.ccLeft != $(this)[0].scrollLeft){
				_me.ccLeft = $(this).find("tr:eq(0)").position().left;
				$('#'+_me.grid+' .x-table-head').offset(function(idx, old){
					return {top: old.top, left: _me.ccLeft}
				});
			}
		});
		
		//记录表头每列宽度
		$('#'+_me.grid+' .x-table-head tr:last td').each(function(){
			_me.headsWidth.push($(this).width())
		})
	},
	
	/**
	 * 从URL请求获取JSON数据，并按照name：value的对应关系把值设置入页面
	 * @param url
	 */
	loadForm: function(url, onSuccess){
		mvc.ready(function(){
			var onloadSuccess = function(data,status){
		    	if(status=='success'){
		    		for(var f in data){
		    			var v = data[f];
		    			var c = $('[name='+f+']:input');
		    			if(c.attr('type') == 'radio'
		    				|| c.attr('type') == 'checkbox'){
		    				$('[name='+f+']:input').each(function(){
		    					if($(this).val()==v){
		    						$(this).attr('checked',true);
		    					}
		    				})
		    			} else{
		    				c.val(v);
		    			}
		    		}
		    		if(onSuccess){
		    			onSuccess(data);
		    		}
		    	} else{
		    		alert('[LoadForm]载入失败')
		    	}
		  	}
			var onloadError = function(xhr,msg,e){
				alert("请求失败："+msg)
			}
			$.ajax({
				  url: url,
				  success: onloadSuccess,
				  error: onloadError,
				  dataType: 'json'
				});
		})
		
	},
	
	/**
	 * 把表单中的输入参数【input、select】转为URL的get参数
	 * @param fid： 表单ID
	 */
	stringForm: function(fid){
		var p = '';
		$('#'+fid+' input').each(function(){
			if(!_.isEmpty($(this).val())){
				if(p.length > 0){
					p += '&';
				}
				p += $(this).attr('name')+'='+mvc.urlEncode($(this).val());
			}
		})
		$('#'+fid+' select').each(function(){
			if(!_.isEmpty($(this).val())){
				if(p.length > 0){
					p += '&';
				}
				p += $(this).attr('name')+'='+mvc.urlEncode($(this).val());
			}
		})
		return p;
	},
	
	urlEncode:  function(str) {
	    str = (str + '').toString();
	    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
	},
	
	urlAddParams: function(url, params){
		if(!_.isEmpty(params)){
			if(url.indexOf('?') > 0){
				return url+'&'+params;
			} else{
				return url+'?'+params;
			}
		}
		return url;
	}
}

CacheMg: {}

//jquery mask遮罩层实现
(function(){
    $.extend($.fn,{
        mask: function(msg,maskDivClass){
            this.unmask();
            // 参数
            var op = {
                opacity: 0.8,
                z: 10000,
                bgcolor: '#ccc'
            };
            var original=$(document.body);
            var position={top:0,left:0};
                        if(this[0] && this[0]!==window.document){
                            original=this;
                            position=original.position();
                        }
            // 创建一个 Mask 层，追加到对象中
            var maskDiv=$('<div class="maskdivgen">&nbsp;</div>');
            maskDiv.appendTo(original);
            var maskWidth=original.outerWidth();
            if(!maskWidth){
                maskWidth=original.width();
            }
            var maskHeight=original.outerHeight();
            if(!maskHeight){
                maskHeight=original.height();
            }
            maskDiv.css({
                position: 'absolute',
                top: position.top,
                left: position.left,
                'z-index': op.z,
                width: maskWidth,
                height:maskHeight,
                'background-color': op.bgcolor,
                opacity: 0
            });
            if(maskDivClass){
                maskDiv.addClass(maskDivClass);
            }
            if(msg){
                var msgDiv=$('<div style="position:absolute;border:#6593cf 1px solid; padding:2px;background:#ccca"><div style="line-height:24px;border:#a3bad9 1px solid;background:white;padding:2px 10px 2px 10px">'+msg+'</div></div>');
                msgDiv.appendTo(maskDiv);
                var widthspace=(maskDiv.width()-msgDiv.width());
                var heightspace=(maskDiv.height()-msgDiv.height());
                msgDiv.css({
                            cursor:'wait',
                            top:(heightspace/2-2),
                            left:(widthspace/2-2)
                  });
              }
              maskDiv.fadeIn('fast', function(){
                // 淡入淡出效果
                $(this).fadeTo('fast', op.opacity);
            })
            return maskDiv;
        },
        unmask: function(){
             var original=$(document.body);
                 if(this[0] && this[0]!==window.document){
                    original=$(this[0]);
              }
              original.find("> div.maskdivgen").fadeOut('fast',0,function(){
                  $(this).remove();
              });
        }
    });
})();